home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / dev / misc / dialoglib.lha / hstack.c < prev    next >
C/C++ Source or Header  |  1993-03-06  |  8KB  |  286 lines

  1. #include <clib/macros.h>
  2. #include <proto/utility.h>
  3. #include "dialog.h"
  4. #ifdef DEBUG1
  5.     #include <stdio.h>
  6. #endif
  7.  
  8. /* filters for structure flag common among all members */
  9. static ULONG getHStackStructure( DialogElement *de )
  10. {
  11.     struct TagItem *tstate, *tag;
  12.     DialogElement *member;
  13.     ULONG structure = DESF_HBaseline;
  14.  
  15.     if( !de )
  16.         return 0;
  17.  
  18.     if( GetTagData( DA_Alignment, 0, de->taglist ) )
  19.         structure = 0;
  20.     else
  21.         for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  22.             if( tag->ti_Tag == DA_Member )
  23.                 if( member = (DialogElement *)tag->ti_Data )
  24.                     structure &= getDialogElementStructure( member );
  25.     return structure;
  26. }
  27.  
  28. static VOID setupHStack( DialogElement *de )
  29. {
  30.     struct TagItem *tstate, *tag;
  31.     DialogElement *member;
  32.     LONG mintop, minbottom, minheight, maxtop, maxbottom, maxheight;
  33.  
  34.     if( !de )
  35.         return;
  36.  
  37.     /* determine structure */
  38.     de->structure = getDialogElementStructure( de );
  39.  
  40.     setMinWidth( de, 0 );            /* modified later */
  41.     setMaxWidth( de, MAX_SPACE );
  42.     if( de->structure & DESF_HBaseline )
  43.     {
  44.         setMinTopExtent( de, 0 );
  45.         setMinBottomExtent( de, 0 );
  46.         setMaxTopExtent( de, 0 );
  47.         setMaxBottomExtent( de, 0 );
  48.     }
  49.     else
  50.     {
  51.         setMinHeight( de, 0 );
  52.         setMaxHeight( de, 0 );
  53.     }
  54.  
  55.     for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  56.         if( tag->ti_Tag == DA_Member )
  57.             if( member = (DialogElement *)tag->ti_Data )
  58.             {
  59.                 ULONG substructure;
  60.  
  61.                 setupDialogElement( member );
  62.                 de->idcmp_mask |= member->idcmp_mask;
  63.                 substructure = getDialogElementStructure( member );
  64.  
  65.                 /* modify Min/MaxWidth to accomodate member */
  66.                 if( substructure & DESF_VBaseline )
  67.                     setMinWidth( de, getMinWidth( de ) +
  68.                         getMinLeftExtent( member ) + getMinRightExtent( member ) );
  69.                 else
  70.                     setMinWidth( de, getMinWidth( de ) + getMinWidth( member ) );
  71.  
  72.                 /* modify Min/MaxHeight or Min/MaxTop/BottomExtent to accomodate member */
  73.                 if( substructure & DESF_HBaseline )
  74.                 {
  75.                     mintop = getMinTopExtent( member );
  76.                     minbottom = getMinBottomExtent( member );
  77.                     maxtop = getMaxTopExtent( member );
  78.                     maxbottom = getMaxBottomExtent( member );
  79.                     if( de->structure & DESF_HBaseline )
  80.                     {
  81.                         if( mintop > getMinTopExtent( de ) )
  82.                             setMinTopExtent( de, mintop );
  83.                         if( minbottom > getMinBottomExtent( de ) )
  84.                             setMinBottomExtent( de, minbottom );
  85.                         if( maxtop > getMaxTopExtent( de ) )
  86.                             setMaxTopExtent( de, maxtop );
  87.                         if( maxbottom > getMaxBottomExtent( de ) )
  88.                             setMaxBottomExtent( de, maxbottom );
  89.                     }
  90.                     else
  91.                     {
  92.                         minheight = mintop + minbottom;
  93.                         maxheight = maxtop + maxbottom;
  94.                         if( minheight > getMinHeight( de ) )
  95.                             setMinHeight( de, minheight );
  96.                         if( maxheight > getMaxHeight( de ) )
  97.                             setMaxHeight( de, maxheight );
  98.                     }
  99.                 }
  100.                 else
  101.                 {
  102.                     minheight = getMinHeight( member );
  103.                     maxheight = getMaxHeight( member );
  104.                     if( minheight > getMinHeight( de ) )
  105.                         setMinHeight( de, minheight );
  106.                     if( maxheight > getMaxHeight( de ) )
  107.                         setMaxHeight( de, maxheight );
  108.                 }
  109.             }
  110. }
  111.  
  112. static ULONG layoutHStack( DialogElement *de, LayoutMessage *lm )
  113. {
  114.     struct TagItem *tstate, *tag;
  115.     DialogElement *member;
  116.     LayoutMessage message;
  117.     LONG count, maxwidth, minwidth, x, white, spare;
  118.     LONG left, right, width;
  119.     ULONG substructure, error = DIALOGERR_OK;
  120.  
  121.     if( !de )
  122.         return DIALOGERR_BAD_ARGS;
  123.     if( !lm )
  124.         return DIALOGERR_BAD_ARGS;
  125.  
  126. #ifdef DEBUG1
  127.     printf(
  128.     "layoutHStack : x %d, y %d, width %d, height %d, left %d, right %d, top %d, bottom %d\n",
  129.         lm->lm_X, lm->lm_Y, lm->lm_Width, lm->lm_Height,
  130.         lm->lm_Left, lm->lm_Right, lm->lm_Top, lm->lm_Bottom );
  131. #endif
  132.  
  133.     x = lm->lm_X;
  134.     count = maxwidth = minwidth = 0;
  135.     for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  136.         if( tag->ti_Tag == DA_Member )
  137.             if( member = (DialogElement *)tag->ti_Data )
  138.             {
  139.                 substructure = getDialogElementStructure( member );
  140.                 if( substructure & DESF_VBaseline )
  141.                 {
  142.                     minwidth += getMinLeftExtent( member ) + getMinRightExtent( member );
  143.                     maxwidth += getMaxLeftExtent( member ) + getMaxRightExtent( member );
  144.                 }
  145.                 else
  146.                 {
  147.                     minwidth += getMinWidth( member );
  148.                     maxwidth += getMaxWidth( member );
  149.                 }
  150.                 count++;
  151.             }
  152.     spare = maxwidth - minwidth;
  153.     white = lm->lm_Width - minwidth;
  154. #ifdef DEBUG1
  155.     printf( "layoutHStack : white %d\n", white );
  156. #endif
  157.     if( white >= spare )    /* extend all members to their maximal horizontal size */
  158.     {
  159.         for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  160.             if( tag->ti_Tag == DA_Member )
  161.                 if( member = (DialogElement *)tag->ti_Data )
  162.                 {
  163.                     substructure = prepareMemberLayoutV( &message, de, member, lm );
  164.                     if( substructure & DESF_VBaseline )
  165.                     {
  166.                         left = getMaxLeftExtent( member );
  167.                         right = getMaxRightExtent( member );
  168.                         prepareLayoutVBaseline( &message, left, right );
  169.                         x += left;
  170.                     }
  171.                     else
  172.                     {
  173.                         width = getMaxWidth( member );
  174.                         prepareLayoutNoVBaseline( &message, width );
  175.                     }
  176.                     prepareLayoutX( &message, x );
  177.                     error = layoutDialogElement( member, &message, lm->lm_PreviousPtr );
  178.                     if( error )
  179.                         break;
  180.                     if( count > 1 )
  181.                         x += white / ( count - 1 );
  182.                     if( substructure & DESF_VBaseline )
  183.                         x += getMaxRightExtent( member );
  184.                     else
  185.                         x += getMaxWidth( member );
  186.                 }
  187.     }
  188.     else
  189.     {
  190.         for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  191.             if( tag->ti_Tag == DA_Member )
  192.                 if( member = (DialogElement *)tag->ti_Data )
  193.                 {
  194.                     substructure = prepareMemberLayoutV( &message, de, member, lm );
  195.                     if( substructure & DESF_VBaseline )
  196.                     {
  197.                         LONG minleft, minright;
  198.  
  199.                         minleft = getMinLeftExtent( member );
  200.                         minright = getMinRightExtent( member );
  201.                         left = getMaxLeftExtent( member ) - minleft;
  202.                         left = minleft + ( ( spare ) ? ( left * white ) / spare : 0 );
  203.                         right = getMaxRightExtent( member ) - minright;
  204.                         right = minright + ( ( spare ) ? ( right * white ) / spare : 0 );
  205.                         prepareLayoutVBaseline( &message, left, right );
  206.                         x += left;
  207.                     }
  208.                     else
  209.                     {
  210.                         LONG minwidth;
  211.  
  212.                         minwidth = getMinWidth( member );
  213.                         width = getMaxWidth( member ) - minwidth;
  214.                         width = minwidth + ( ( spare ) ? ( width * white ) / spare : 0 );
  215.                         prepareLayoutNoVBaseline( &message, width );
  216.                     }
  217.                     prepareLayoutX( &message, x );
  218.                     error = layoutDialogElement( member, &message, lm->lm_PreviousPtr );
  219.                     if( error )
  220.                         break;
  221.                     if( substructure & DESF_VBaseline )
  222.                         x += right;
  223.                     else
  224.                         x += width;
  225.                 }
  226.     }
  227.     return error;
  228. }
  229.  
  230. static DialogElement *matchHStack( DialogElement *de, MatchMessage *mm )
  231. {
  232.     struct TagItem *tstate, *tag;
  233.     DialogElement *member, *match = NULL;
  234.  
  235.     if( !de )
  236.         return NULL;
  237.     if( !mm )
  238.         return NULL;
  239.  
  240.     for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  241.         if( tag->ti_Tag == DA_Member )
  242.             if( member = (DialogElement *)tag->ti_Data )
  243.                 if( match = mapDialogEvent( member, mm->mm_IntuiMsg ) )
  244.                     break;
  245.     return match;
  246. }
  247.  
  248. static VOID clearHStack( DialogElement *de )
  249. {
  250.     struct TagItem *tstate, *tag;
  251.     DialogElement *member;
  252.  
  253.     if( !de )
  254.         return;
  255.  
  256.     for( tstate = de->taglist; tag = NextTagItem( &tstate ); )
  257.         if( tag->ti_Tag == DA_Member )
  258.             if( member = (DialogElement *)tag->ti_Data )
  259.                 clearDialogElement( member );
  260. }
  261.  
  262. ULONG dispatchHStack( struct Hook *hook, DialogElement *de, DialogMessage *dm )
  263. {
  264.     ULONG result;
  265.  
  266.     switch( dm->dm_MethodID )
  267.     {
  268.     case DIALOGM_GETSTRUCT:
  269.         result = getHStackStructure( de );
  270.         break;
  271.     case DIALOGM_SETUP:
  272.         setupHStack( de );
  273.         break;
  274.     case DIALOGM_LAYOUT:
  275.         result = layoutHStack( de, (LayoutMessage *)dm );
  276.         break;
  277.     case DIALOGM_MATCH:
  278.         result = (ULONG)matchHStack( de, (MatchMessage *)dm );
  279.         break;
  280.     case DIALOGM_CLEAR:
  281.         clearHStack( de );
  282.         break;
  283.     }
  284.     return result;
  285. }
  286.